/**
 * 
 */
package at.ac.tuwien.ifs.calendit.basis.gui;

import java.sql.Date;
import java.sql.Time;
import java.util.ArrayList;
import java.util.List;

import javax.swing.ButtonGroup;
import javax.swing.table.AbstractTableModel;


import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

import at.ac.tuwien.ifs.calendit.basis.helper.Constants;

import at.ac.tuwien.ifs.calendit.dao.IMeetingsAnfrage;
import at.ac.tuwien.ifs.calendit.domain.MeetingsAnfrage;
import at.ac.tuwien.ifs.calendit.domain.TODO;


/**
 * @author Pinar
 *
 */
public class MeetingsAnfrageTableModel extends AbstractTableModel{
        private List <MeetingsAnfrage> meetingsanfrage = null;
        private MeetingsAnfrage t;
        private XmlBeanFactory xbf = null;
        private  IMeetingsAnfrage maDao = null;
        private RaumTableModel raumTM;
        private TODOTableModel todoTM;
        private ClassPathResource res = null;
        private List<Integer>listofMeetings= new ArrayList<Integer>();

        private final String[] colnames = {"Bezeichnung","Datum", "Beginn", "Ende","Raum","Aufgabe"};
        
        public MeetingsAnfrageTableModel(){
                super();
                initDAO();
                getMAData();
        }
        private void getMAData(){
        	MeetingsAnfrage temp= new MeetingsAnfrage();
        	temp.setTeilnehmerid(Constants.getUserId());
        	temp.setErstellerid(Constants.getUserId());
                meetingsanfrage = maDao.getAll(temp);
                }
        
        /**
		 * Returns a single meetingsanfrage out of this TableModel.
		 * 
		 * @param i
		 *            The index of the desired meetingsanfrage.
		 * @return The meetingsanfrage at position <c>i</c>.
		 * @see #getmeetingsanfrage()
		 */
		public MeetingsAnfrage getMeetingsanfrageAt(int i) {
			return meetingsanfrage.get(i);
		}
		
		public List<MeetingsAnfrage> getAllMAs(){
			return maDao.getAll();
		}
		
		public boolean deleteMA(int id){
			return maDao.delete(id);
		}

        public int getColumnCount(){
                return colnames.length;
        }
        public int getRowCount(){
        	if(meetingsanfrage!=null)
                return meetingsanfrage.size();
        	else
        		return 0;
        }
        public String getColumnName(int c){
                return colnames[c];
        }
        public MeetingsAnfrage getTerminToTermintyp(int typ){
                t= maDao.getById(typ);
                fireTableDataChanged();
                return t;
        }
        public Object getValueAt(int row, int col){
                MeetingsAnfrage t = meetingsanfrage.get(row);
                switch(col){
                case 0: 
                        return t.getBezeichnung();
                case 1:
                        return t.getDatum();
                case 2: 
                        return t.getBeginnzeit();
                case 3:
                        return t.getEndzeit();
                case 4:
                		return raumTM.getRaumById(t.getRaumid()).getRaumname();
//                	    return t.getRaumid();
                case 5:
                		if(t.getAgendaid()==0)
                			return "   ";
                		try{
                			return todoTM.getTodoByID(t.getAgendaid()).getBezeichnung();         
                		}catch (Exception e) {
                			return "   ";// TODO Auto-generated catch block
                		}
                		
                		default:
                        return null;
                                }
        }
        public MeetingsAnfrage getMeetingsAnfrageToId(int i){
                return meetingsanfrage.get(i);
        }
        public void reload(){
                getMAData();
                fireTableDataChanged();
        }
        
        public void refreshAusgehende(){
        	meetingsanfrage=getAusgehende("beides");
        	MeetingsAnfragenUebersicht.rb_Ausgehende.setSelected(true);
        	MeetingsAnfragenUebersicht.cb_akzeptiert.setSelected(true);
        	MeetingsAnfragenUebersicht.cb_offene.setSelected(true);
        	fireTableDataChanged();
        }
        private void initDAO(){

              res = new ClassPathResource(Constants.SPRINGBEANS);
              xbf = new XmlBeanFactory(res);
              maDao = (IMeetingsAnfrage) xbf.getBean("MeetingsAnfrageDAO");
              raumTM= new RaumTableModel("ID");
              todoTM= new TODOTableModel("aufgabeId");
        }
        
        public MeetingsAnfrage insert(MeetingsAnfrage ma){
        	return maDao.add(ma);
        }		
        
        public int getMaxOfKennung(){
        	List<MeetingsAnfrage> temp= new ArrayList<MeetingsAnfrage>();
//    		temp=maDao.getMaxOfKennung();
//    		int max=0;
//    		for(int i=0; i<temp.size(); i++){
//    			if(temp.get(i).getMeetingkennung()>max)
//    				max=temp.get(i).getMeetingkennung();
//    				System.out.println(temp.get(i).getBezeichnung());
//    		}
        	return maDao.getMaxOfKennung();
    	}
        
        public List<MeetingsAnfrage> getAusgehende(String typ) {
			List<MeetingsAnfrage> tempList= new ArrayList<MeetingsAnfrage>();
			listofMeetings= new ArrayList<Integer>();
			getMAData();
			if(typ.equals("beides")){
				for(int i=0;i<meetingsanfrage.size();i++){
//					if(meetingsanfrage.get(i).getTeilnehmerid()==Constants.getUserId() && meetingsanfrage.get(i).getErstellerid()==Constants.getUserId())
					if(meetingsanfrage.get(i).getTeilnehmerid()==Constants.getUserId() && meetingsanfrage.get(i).getErstellerid()==Constants.getUserId())
						;
					else
					if(meetingsanfrage.get(i).getErstellerid()==Constants.getUserId())
						if(!listofMeetings.contains(meetingsanfrage.get(i).getMeetingkennung())){
							tempList.add(meetingsanfrage.get(i));
							listofMeetings.add(meetingsanfrage.get(i).getMeetingkennung());
						}
				}
        	}
        	else
        		if(typ.equals("offene")){
        			for(int i=0;i<meetingsanfrage.size();i++){
        				if(meetingsanfrage.get(i).getTeilnehmerid()==Constants.getUserId() && meetingsanfrage.get(i).getErstellerid()==Constants.getUserId())
        					;
        				else
    					if(meetingsanfrage.get(i).getErstellerid()==Constants.getUserId() && meetingsanfrage.get(i).getBestaetigtid()==3)
    						if(!listofMeetings.contains(meetingsanfrage.get(i).getMeetingkennung())){
    							tempList.add(meetingsanfrage.get(i));
    							listofMeetings.add(meetingsanfrage.get(i).getMeetingkennung());
    						}
    				}
        		}
        		else
        			if(typ.equals("akzeptierte")){
            			for(int i=0;i<meetingsanfrage.size();i++){
            				if(meetingsanfrage.get(i).getTeilnehmerid()==Constants.getUserId() && meetingsanfrage.get(i).getErstellerid()==Constants.getUserId())
            					;
            				else
        					if(meetingsanfrage.get(i).getErstellerid()==Constants.getUserId() && meetingsanfrage.get(i).getBestaetigtid()==1)
        						if(!listofMeetings.contains(meetingsanfrage.get(i).getMeetingkennung())){
        							tempList.add(meetingsanfrage.get(i));
        							listofMeetings.add(meetingsanfrage.get(i).getMeetingkennung());
        						}
        				}
            		}
        			
			return tempList;
		}
        public List<MeetingsAnfrage> getEingehende(String typ) {
        	List<MeetingsAnfrage> tempList= new ArrayList<MeetingsAnfrage>();
			listofMeetings= new ArrayList<Integer>();
			getMAData();
			if(typ.equals("beides")){
				for(int i=0;i<meetingsanfrage.size();i++){
					if(meetingsanfrage.get(i).getTeilnehmerid()==Constants.getUserId() && meetingsanfrage.get(i).getErstellerid()==Constants.getUserId())
						;
					else
					if(meetingsanfrage.get(i).getTeilnehmerid()==Constants.getUserId())
						if(!listofMeetings.contains(meetingsanfrage.get(i).getMeetingkennung())){
							tempList.add(meetingsanfrage.get(i));
							listofMeetings.add(meetingsanfrage.get(i).getMeetingkennung());
						}
				}
        	}
        	else
        		if(typ.equals("offene")){
        			System.out.println("offene im if:"+meetingsanfrage.size());
        			for(int i=0;i<meetingsanfrage.size();i++){
        				System.out.println("offen:"+ meetingsanfrage.get(i).getBestaetigtid()+" "+meetingsanfrage.get(i).getTeilnehmerid());
        				if(meetingsanfrage.get(i).getTeilnehmerid()==Constants.getUserId() && meetingsanfrage.get(i).getErstellerid()==Constants.getUserId())
        					System.out.println("bin auch ersteller");
        				else
    					if(meetingsanfrage.get(i).getTeilnehmerid()==Constants.getUserId() && meetingsanfrage.get(i).getBestaetigtid()==3){
    						System.out.println("teilnehmer aber beinhaltet");
    						if(!listofMeetings.contains(meetingsanfrage.get(i).getMeetingkennung())){
    							tempList.add(meetingsanfrage.get(i));
    							listofMeetings.add(meetingsanfrage.get(i).getMeetingkennung());
    							System.out.println("offene drinn");
    						}
    					}
    				}
        		}
        		else
        			if(typ.equals("akzeptierte")){
            			for(int i=0;i<meetingsanfrage.size();i++){
            				System.out.println("offen:"+ meetingsanfrage.get(i).getBestaetigtid()+" "+meetingsanfrage.get(i).getTeilnehmerid());
            				if(meetingsanfrage.get(i).getTeilnehmerid()==Constants.getUserId() && meetingsanfrage.get(i).getErstellerid()==Constants.getUserId())
            					;
            				else
        					if(meetingsanfrage.get(i).getTeilnehmerid()==Constants.getUserId() && meetingsanfrage.get(i).getBestaetigtid()==1)
        						if(!listofMeetings.contains(meetingsanfrage.get(i).getMeetingkennung())){
        							tempList.add(meetingsanfrage.get(i));
        							listofMeetings.add(meetingsanfrage.get(i).getMeetingkennung());
        							System.out.println("akzeptierte");
        						}
        				}
            		}
        			
			return tempList;
		}
        
        public List<MeetingsAnfrage> getAlle(String typ) {
			List<MeetingsAnfrage> tempList= new ArrayList<MeetingsAnfrage>();
			listofMeetings= new ArrayList<Integer>();
        	getMAData();
        	if(typ.equals("beides")){
				tempList=meetingsanfrage;
        	}
        	else
        		if(typ.equals("offene")){
        			for(int i=0;i<meetingsanfrage.size();i++){
        				if(meetingsanfrage.get(i).getTeilnehmerid()==Constants.getUserId() && meetingsanfrage.get(i).getErstellerid()==Constants.getUserId())
        					;
        				else
    					if(meetingsanfrage.get(i).getBestaetigtid()==3 )
    						if(!listofMeetings.contains(meetingsanfrage.get(i).getMeetingkennung())){
    						tempList.add(meetingsanfrage.get(i));
    						listofMeetings.add(meetingsanfrage.get(i).getMeetingkennung());
    						}
    				}
        		}
        		else{
            			for(int i=0;i<meetingsanfrage.size();i++){
            				if(meetingsanfrage.get(i).getTeilnehmerid()==Constants.getUserId() && meetingsanfrage.get(i).getErstellerid()==Constants.getUserId())
            					;
            				else
        					if(meetingsanfrage.get(i).getBestaetigtid()==1)
        						if(!listofMeetings.contains(meetingsanfrage.get(i).getMeetingkennung())){
        						tempList.add(meetingsanfrage.get(i));
        						listofMeetings.add(meetingsanfrage.get(i).getMeetingkennung());
        						}
        				}
        		}
			return tempList;
		}
        //TODO: eingehende nochmal kontrollieren!!!
        public void changeContent(){
        	if(MeetingsAnfragenUebersicht.rb_Ausgehende.isSelected()){
        		System.out.println("ausgehende selekted");
        		if(MeetingsAnfragenUebersicht.cb_akzeptiert.isSelected()){
        			if(MeetingsAnfragenUebersicht.cb_offene.isSelected()){
        				meetingsanfrage=getAusgehende("beides");
        				System.out.println("ausgehende beides");
        			}
        			else{
        				meetingsanfrage= getAusgehende("akzeptierte");
        				System.out.println("ausgehende akzeptierte");
        			}
        		}
        		else{
        			if(MeetingsAnfragenUebersicht.cb_offene.isSelected()){
        				meetingsanfrage= getAusgehende("offene");
        				System.out.println("ausgehende offenes");
        			}
        			else{
        				meetingsanfrage=null;
        			}
        		}
        	}
        	else{
        		if(MeetingsAnfragenUebersicht.rb_Eingehende.isSelected()){
        			System.out.println("eingehende selekted");
        			if(MeetingsAnfragenUebersicht.cb_akzeptiert.isSelected()){
            			if(MeetingsAnfragenUebersicht.cb_offene.isSelected()){
            				meetingsanfrage=getEingehende("beides");
            				System.out.println("eingehende beides");
            			}
            			else{
            				meetingsanfrage= getEingehende("akzeptierte");
            				System.out.println("eingehende akzeptierte");
            			}
        			}
            		else{
            			if(MeetingsAnfragenUebersicht.cb_offene.isSelected()){
            				meetingsanfrage= getEingehende("offene");
            				System.out.println("eingehende offene");
            			}
            			else{
            				meetingsanfrage=null;
            				System.out.println("eingehende null");
            			}
            		}
        		}
        	
        		else{
        			if(MeetingsAnfragenUebersicht.cb_akzeptiert.isSelected()){
            			if(MeetingsAnfragenUebersicht.cb_offene.isSelected())
            				meetingsanfrage=getAlle("beides");
            			else
            				meetingsanfrage= getAlle("akzeptierte");
        			}
            		else{
            			if(MeetingsAnfragenUebersicht.cb_offene.isSelected())
            				meetingsanfrage= getAlle("offene");
            			else
            				meetingsanfrage=null;
            		}
        		}
        			
        	}
			
			fireTableDataChanged();
		}
        
       public List<MeetingsAnfrage> getTeilnehmerofMeeting(int meetid){
    	   return maDao.getMeetingsAnfrageByKennung(meetid);
       }
    	
       public MeetingsAnfrage updateMA(MeetingsAnfrage m){
    	   return maDao.update(m);
       }
       
       public List<MeetingsAnfrage> getAll2(){
    	   return maDao.getAll2();
       }
       
       public boolean deleteByKennung(int id){
    	   return maDao.deleteByKennung(id);
       }
       
       public List<MeetingsAnfrage> getMyMeeting(int kennung){
    	  return maDao.getMyMeeting(kennung);
       }
       
       public MeetingsAnfrage getMATermin(MeetingsAnfrage ma){
     	  return maDao.getMeetingsAnfrageTermin(ma);
        }
}
